<?php
// +----------------------------------------------------------------------
// | quanli team
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2020 http://www.fistforward.com/ All rights reserved.
// +----------------------------------------------------------------------
// | Author: allen.qiang
// +----------------------------------------------------------------------

/**
 * 文件类
 * @package  htdocs
 * @author   allen.qiang
 * @version 1.0
 */

class quanliFile {

    /**
     * 保存文件
     * @param string $file_address 文件绝对地址
     * @param string $file_content 文件内容
     * @return bool
     */
    public function write( $file_address, $file_content ) {

        if (! file_put_contents ( $file_address, $file_content, LOCK_EX ) )
            return false;
        return true;

    }

    /**
     * 传入文件地址，生成保存到数据库的新文件地址
     * @param $file_address
     * @return string
     */
    public function basename_db( $file_address ) {

        $file_address = str_replace( G_IMAGE_URL, '', $file_address );
        $file_address = str_replace( '/quanliadmin/docroot/images/', '', $file_address );
        return $file_address;

    }

    /**
     * 得到上传文件，并保存为新文件在服务器上
     * @param string $directory_name 目录名
     * @param array $format_array 文件格式数组
     * @return array
     */
    public function get_upload_file( $directory_name, $format_array = array('xlsx', 'xls') ) {

        //检查上传的文件
        switch ($_FILES['search_file']['error']) {

            case 1: // 文件大小超出了服务器的空间大小
                return array( 'message' => '文件过大，请重新上传', 'code' => 404 );
                break;

            case 2: // 要上传的文件大小超出浏览器限制
                return array( 'message' => '文件过大，请重新上传', 'code' => 404 );
                break;

            case 3: // 文件仅部分被上传
                return array( 'message' => '文件上传有误，请重新上传', 'code' => 404 );
                break;

            case 4: // 没有找到要上传的文件
                return array( 'message' => '请选择上传的文件，请重新上传', 'code' => 404 );
                break;

            case 5: // 服务器临时文件夹丢失
                return array( 'message' => '服务器临时文件夹丢失，请重新上传', 'code' => 404 );
                break;

            case 6: // 文件写入到临时文件夹出错
                return array( 'message' => '文件写入到临时文件夹出错，请重新上传', 'code' => 404 );
                break;

            default:
                break;

        }

        //分解文件名和扩展名
        $fileArray = explode('.', $_FILES['search_file']['name']);
        $index = count($fileArray) - 1;
        $extension = strtolower($fileArray[$index]); //将扩展名转化成小写

        //检查格式是否正确
        if (!in_array($extension, $format_array)) {
            return array( 'code' => 404, 'message' => '文件格式错误，格式：' . implode(',', $format_array ) );
        }


        //生成新文件的名称和目录
        $fileDir = G_APPLICATION_BASEPATH . 'quanliadmin/docroot/file/' .$directory_name . '/' . date(G_DEFAULT_DATE_FORMAT) . '/';
        if(!file_exists($fileDir)) {
            mkdir($fileDir, 0777, true);
        }
        $fileName = $fileDir . make_uuid() . '.xlsx';


        //移动文件到指定的目录下
        $move_result = move_uploaded_file($_FILES['search_file']['tmp_name'], $fileName);
        if (!$move_result) {
            return array( 'message' => '文件上传失败', 'code' => 404 );
        }

        return array( 'code' => 200, 'message' => '文件上传成功', 'data' => $fileName );

    }

    /**
     * 读取Excel文件内容
     * @param string $fileName 文件名
     * @param int $row 从第几行开始读，默认第一行
     * @return array
     */
    public function readerExcel( $fileName, $row = 1) {

        //加载phpexcel相关类
        quanli_include('framework/phpExecl/PHPExcel.php');
        quanli_include('framework/phpExecl/PHPExcel/Reader/Excel2007.php');

        //实例phpexcel类
        $PHPExcel = new PHPExcel();

        //实例reader类
        $PHPReader = new PHPExcel_Reader_Excel2007();

        //检查是否可以读取文件内容
        if (!$PHPReader->canRead($fileName)) {
            return array( 'code' => 404, 'message' => '文件读取失败，请检查文件是否是xlsx文件' );
        }

        //设置超时时间和文本大小
        ini_set('max_execution_time', 1800);
        ini_set('memory_limit', '512M');


        //加载文件内容
        $PHPExcel = $PHPReader->load( $fileName );

        /**读取excel文件中的第一个工作表*/
        $currentSheet = $PHPExcel->getSheet(0);

        /**取得一共有多少行*/
        $allRow = $currentSheet->getHighestRow();

        $data_array = array();

        if ($allRow >= $row) {

            /**取得最大的列号*/
            $allColumn = $currentSheet->getHighestColumn();

            for($currentRow = $row; $currentRow <= $allRow; $currentRow++) {

                $temp_array = array();

                /**从第A列开始输出*/
                for ($currentColumn= 'A'; $currentColumn <= $allColumn; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue();/**ord()将字符转为十进制数*/
                    $val = iconv('gb2312', 'utf-8', $val);
                    $temp_array[] = $val;
                }

                $data_array[] = $temp_array;

            }

        } else {

            return array( 'code' => 404, 'message' => '文件内容为空，读取失败' );

        }

        //恢复到初始状态
        ini_restore('max_execution_time');
        ini_restore('memory_limit');

        return array( 'code' => 200, 'message' => 'ok', 'data' => $data_array );

    }

    /**
     * 读取Excel文件内容
     * @param string $fileName 文件名
     * @param int $row 从第几行开始读，默认第一行
     * @return array
     * 与上一个函数区别为本函数无iconv('gb2312', 'utf-8', $val); 转换语句
     * 解决从EXCEL读出中文乱码问题
     * add by allen.qiang 2014/12/09
     */
    public function readerExcel1( $fileName, $row = 1) {

        //加载phpexcel相关类
        quanli_include('framework/phpExecl/PHPExcel.php');
        quanli_include('framework/phpExecl/PHPExcel/Reader/Excel2007.php');

        //实例phpexcel类
        $PHPExcel = new PHPExcel();

        //实例reader类
        $PHPReader = new PHPExcel_Reader_Excel2007();

        //检查是否可以读取文件内容
        if (!$PHPReader->canRead($fileName)) {
            return array( 'code' => 404, 'message' => '文件读取失败，请检查文件是否是xlsx文件' );
        }

        //设置超时时间和文本大小
        ini_set('max_execution_time', 1800);
        ini_set('memory_limit', '512M');


        //加载文件内容
        $PHPExcel = $PHPReader->load( $fileName );

        /**读取excel文件中的第一个工作表*/
        $currentSheet = $PHPExcel->getSheet(0);

        /**取得一共有多少行*/
        $allRow = $currentSheet->getHighestRow();

        $data_array = array();

        if ($allRow >= $row) {

            /**取得最大的列号*/
            $allColumn = $currentSheet->getHighestColumn();

            for($currentRow = $row; $currentRow <= $allRow; $currentRow++) {

                $temp_array = array();

                /**从第A列开始输出*/
                for ($currentColumn= 'A'; $currentColumn <= $allColumn; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65, $currentRow)->getValue();/**ord()将字符转为十进制数*/
                    //$val = iconv('gb2312', 'utf-8', $val);
                    $temp_array[] = $val;
                }

                $data_array[] = $temp_array;

            }

        } else {

            return array( 'code' => 404, 'message' => '文件内容为空，读取失败' );

        }

        //恢复到初始状态
        ini_restore('max_execution_time');
        ini_restore('memory_limit');

        return array( 'code' => 200, 'message' => 'ok', 'data' => $data_array );

    }

}